﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AuktionsServer
{
	class Auktion
	{
		string auktionsobjekt;
		object auktionsobjektLås = new object();
		int mindstebud;
		int bud = -1;
		object budLås = new object();
		int vinderID;
		object IDlås = new object();
		DateTime sidstebud;
		object sidstebudLås = new object();

		/// <summary>
		/// Constructor for Auktionsobjekt
		/// </summary>
		/// <param name="auktionsobjekt">Navn på tingen som skal sælges</param>
		/// <param name="mindstebud">Mindstebud. Første bud skal være lig med eller større end dette tal</param>
		public Auktion(string auktionsobjekt, int mindstebud)
		{
			this.auktionsobjekt = auktionsobjekt;
			this.mindstebud = mindstebud;
		}

		/// <summary>
		/// Kaldes når der skal afgives et bud
		/// </summary>
		/// <param name="bud">Værdien af budet</param>
		/// <param name="ID">IDet på  klienten som giver budet</param>
		/// <returns>Buddet sendes tilbage hvis budet er successfuldt, "underbud" hvis budet er under nuværende bud, eller "mindstebud" hvis budet er under mindstebuddet</returns>
		public string GivBud(int bud, int ID)
		{
			lock(budLås){lock(IDlås)
			{
				if (bud >= mindstebud)
				{
					if (bud > this.bud)
					{
						this.bud = bud;
						vinderID = ID;

						return bud.ToString();
					}
					return "underbud";
				}
				return "mindstebud";
			}}
		}

		/// <summary>
		/// Get or set auktionsobjektet
		/// </summary>
		public string Auktionsobjekt
		{
			get { lock (auktionsobjektLås) { return auktionsobjekt; } }
			set { lock (auktionsobjektLås) { auktionsobjekt = value; } }
		}

		/// <summary>
		/// Get or set budet
		/// </summary>
		public int Bud
		{
			get { lock (budLås) { return bud; } }
			set { lock (budLås) { bud = value; } }
		}

		/// <summary>
		/// Get mindstebudet (er ikke trådsikret)
		/// </summary>
		public int Mindstebud
		{
			get { return mindstebud; }
		}

		/// <summary>
		/// Get or set hvornår det sidste bud blev gjort
		/// </summary>
		public DateTime SidsteBud
		{
			get { lock (sidstebudLås) { return sidstebud; } }
			set { lock (sidstebudLås) { sidstebud = value; } }
		}

		/// <summary>
		/// Get or set IDet for klienten med højeste bud
		/// </summary>
		public int VinderID
		{
			get { lock (IDlås) { return vinderID; } }
			set { lock (IDlås) { vinderID = value; } }
		}
	}
}
